Vreemde sleutels
Home

Vreemde sleutels

Vreemde sleutels

Je moet vermijden om dezelfde infomatie meer dan één keer in je database op te slagen. De dubbels moeten eruit!

Probleem

Als dezelfde informatie op meer dan één plaats in je database voorkomt, loop je het risico dat je database niet meer consistent is. Je gaat de informatie op de ene plaats wijzigen en niet op de andere. Dan heb je een 'fout' in je database en is die niet meer consistent of niet meer 'integer'.

Oplossing

We vertrekken van de volgende Boeken tabel:

Boeken

Id

Voornaam

Familienaam

Titel

1

Jef

Nys

De jacht op een voetbal

2

Jean-Paul

Sartre

Het zijn en het niets

3

Greet

Bauweleers

Gebroken

4

Jef

Nys

De straalvogel

5

Jean-Paul

Sartre

De woorden

Bekijk goed de bovenstaande tabel. Zoek naar dubbele waarden.

In de kolom Voornaam komt de naam Jef en Jean-Paul in twee verschillende rijen voor. In de kolom Familienaam hebben Sartre en Nys in twee verschillende rijen. Als een waarde in een kolom op meer dan één rij voorkomt, hebben we een dubbele waarde. Later zien we hoe we de dubbels op wetenschappelijke manier verwijderen door de normalisatieprocedure uit te voeren. Maar eerst doen we het intuïtief.

We kopiëren de tabel en geven een naam aan die tabel. Vermits we alleen geïnteresseerd zijn in persoonsgegevens, noemen we die tabel Persoon.

De tabel Persoon gebruiken we om eigenschappen van de entiteit persoon in op slagen. Nu staan de boekgevevens er nog in, maar die gooien we er later uit.

Personen

Id

Voornaam

Familienaam

Titel

1

Jef

Nys

De jacht op een voetbal

2

Jean-Paul

Sartre

Het zijn en het niets

3

Greet

Bauweleers

Gebroken

4

Jef

Nys

De straalvogel

5

Jean-Paul

Sartre

De woorden

Bekijk nu goed de waarden in de kolom Id van de tabel Personen. Zie je waar een probleem zit? De Id kolom is namelijk een primaire sleutel. Dat wil zeggen dat de waarde op unieke manier een rij moet indentificeren. Is dat nog zo, nu dat we alleen nog in de kolom Voornaam en Familienaam geïnteresseerd zijn?

Het is wel zo dat de Id voor elke rij verschillend is. Maar Nys en Sartre hebben wel elk twee id's.

Er zitten m.a.w. dubbele rijen in de tabel. Die moeten eruit. De dubbels gooien we eruit, namelijk die met dezelfde voornaam en familienaam.

Personen

Id

Voornaam

Familienaam

Titel

1

Jef

Nys

De jacht op een voetbal

2

Jean-Paul

Sartre

Het zijn en het niets

3

Greet

Bauweleers

Gebroken

De Id kolom bevat voor elke auteur een vingerafdruk en is dus de primaire sleutel van de tabel Personen.

In de tabel Personen moet de Titel kolom verwijderd worden. En in de tabel Boeken, de kolommen met de naam Voornaam en Familienaam. Voorlopig laten we die staan. Maar we weten nu al dat ze later verwijderd zullen worden. Ik kleur ze alvast in het rood.

Als die kolommen verwijderd zullen zijn, hoe kan ik dan weten welke boeken door een bepaalde auteur zijn geschreven. Of hoe kom ik te weten wie de auteur van een bepaald boek is?

Daarvoor voegen we eerst een kolom toe in de tabel Boeken met de naam IdPersoon:

Boeken

Id

Voornaam

Familienaam

Titel

IdAuteur

1

Jef

Nys

De jacht op een voetbal

2

Jean-Paul

Sartre

Het zijn en het niets

3

Greet

Bauweleers

Gebroken

4

Jef

Nys

De straalvogel

5

Jean-Paul

Sartre

De woorden

We beginnen met een vreemde sleutel te maken (foreign key). We kopiëren de Id waarde van de tabel Persoenn in de kolom IdAuteur. We gaan dat niet één voor één manueel doen, maar met een UPDATE statement waarbij we een link leggen tussen de tabellen op basis van Voornaam en Familienaam. Die kolommen hebben speciaal daarvoor nog niet verwijderd.

create-a-foreign-key
create a foreign key

Daarna verwijderen we de kolommen Voornaam en Familienaam uit Boeken. We hebben namelijk een nieuwe kolom IdAuteur om de auteurspersoon op de zoeken in de tabel Personen:

Boeken

Id

Titel

IdAuteur

1

De jacht op een voetbal

1

2

Het zijn en het niets

2

3

Gebroken

3

4

De straalvogel

1

5

De woorden

2

De kolom IdAuteur is een vreemde sleutel of foreign key omdat de kolom verwijst naar de primaire sleutel in een 'vreemde' tabel, namelijk Personen.

Om een relatie te leggen tussen twee tabellen heb je twee tabellen nodig. In een van de tabellen heb je een foreign key nodig die verwijst naar de primary key in de andere tabel.

Tenslotte verwijderen we de Titel kolom uit de tabel Personen.

Personen

Id

Voornaam

Familienaam

1

Jef

Nys

2

Jean-Paul

Sartre

3

Greet

Bauweleers

JI
2018-05-02 16:19:40